VINS Fusion 笔记

VINS-Fusion 是港科大开源的VIO算法,VINS-Fusion 是基于视觉惯性的滑动窗口的紧耦合SLAM系统。2017年港科大开源了VINS-Mono, 支持单目和IMU的slam系统,此次开源系统支持如下传感器:

单目 + IMU
双目
双目 + IMU
双目 + IMU + GPS

详细请参考https://github.com/HKUST-Aerial-Robotics/VINS-Fusion

Calibration

Target

  • Calibrate the pose relationship between left and right camera
  • Calibrate the pose relationship left camera between and IMU

Generate tag

kalibr_create_target_pdf —type apriltag —nx 4 —ny 6 —tsize 0.05 —tspace 0.2

Record rosbag

rosrun topic_tools throttle messages /camera/fisheye1/image_rect_raw 4.0 /camera/fisheye1/image_raw
rosrun topic_tools throttle messages /camera/fisheye2/image_rect_raw 4.0 /camera/fisheye2/image_raw

IMU intrinsic

kalibr requires imu data to be calibrated by intrinsic parameters by default.The intrinsic parameters calibration tool uses imu_utils, and analize allan using imu_tk.

rosrun imu_utils imu_an _imu_topic:=/motion_camera/imu/data_raw _imu_name:=t265 _data_save_path:=./ _max_time_min:=30 _max_cluster:=100
rosbag play imu-static.bag

Multiple camera calibration

kalibr_calibrate_cameras —approx-sync 0.01 —show-extraction —target ./april_4x6.yaml —models omni-radtan omni-radtan —bag ./t265_april_0.5_0.2-static.bag —topics /motion_camera/left/image_raw /motion_camera/right/image_raw

Camera IMU calibration

kalibr_calibrate_imu_camera —show-extraction —bag ./t265-april_0.5_0.2-dynamic.bag —cam ./camchain-.t265-april_0.5_0.2-static.yaml —imu ./imu.yaml —target ./april_4x6.yaml

VINS 框架

坐标系统于符号定义

VINS系统会有三个坐标系统,分别为世界坐标系,Body/IMU坐标系和相机坐标系。其中:

$(.)^{w}$ 定义为世界坐标系
$(.)^{b}$ 定义为Body/IMU坐标系
$(.)^{c}$ 定义为相机坐标系
$q_{b}^{w} \ p_{b}^{w}$ 定义为IMU坐标系到世界坐标系的旋转和平移变换
$b_{k}$ 定义为捕获到第k个图像时刻的IMU坐标系
$c_{k}$ 定义为捕获到第k个图像时刻的相机坐标系
$g^{w} = [0, 0, g]^{T}$ 定义为在世界坐标系下的重力向量
$\hat{(.)}$ 定义为具有噪声的观测量或估计量

初始化

陀螺仪Bias

通过视觉和陀螺仪积分计算得到的两个旋转误差做最小二乘得到陀螺仪bias。

其中:

两项测量几乎相等得到:

取虚部得到:

即可求取出$\delta b_{w}$.

代码实现上采用LDLT分解, 对于一个最小二乘问题$Ax = b$ 等价于求解正规方程$A^TAx = A^Tb$.

对于多次观测的情况下:

紧耦合滑动窗口后端优化

对于滑动窗口内,系统需要求解的状态向量如下所示:

其中包含 n+1 个所有相机的状态(包括位置、朝向、速度、加速度计 bias 和陀螺仪 bias)、Camera 和IMU之间的外参、m+1个Map Point的逆深度。

最小二乘目标函数

可以将目标函数拆分成三个部分,都用马氏距离表示,分别为:

  • 边缘化先验信息
  • IMU测量残差
  • 视觉重投影残差

视觉重投影残差

误差方程

相比于传统的小孔成像模型归一化平面的重投影误差,这里定义了单位球上的重投影误差。通过将当前图像观测到的landmark变换到当前单位圆上(预测值)与当前图像特征点(观测值)相减,定义出误差方程。

优化变量

Jacobian

对应的jacobian分别如下:

下面对$J[0]^{3 \times 6} = \left[\frac{\partial r_{C}}{\partial p_{b_{i}}^{w}}, \frac{\partial r_{C}}{\partial q_{b_{i}}^{w}}\right]$ 进行推导:

关于位置部分,由复合函数求导法则:

关于旋转部分:
参考Quaternion kinematics for the error-state Kalman filter Perturbations, uncertainties, noise部分公式189, 190, 191, 192 :

Cross Product

由复合函数求导法则对误差函数分解,设:

求导,得:

则:

协方差

对于视觉的协方差,为重投影误差,假设为1.5像素,则信息矩阵为协方差矩阵的逆:

IMU 残差

IMU是惯性测量单元,在VINS中,IMU具有两个设备,分别为陀螺仪和加速度计,其中陀螺仪测量IMU坐标系下的旋转角速度,加速度计测量IMU坐标系下的线性加速度(包括重力加速度)。

其中$b_{a} \ b_{w}$ 为零偏,服从随机游走,由于元器件内部机械、温度造成,$n_{a} \ n_{w}$为白噪声,由于AD转换器件测量噪声造成。

IMU 动力学方程

一个刚体在同一个惯性坐标系下进行平移运动,其平移量对时间的一阶导和二阶导即速度和加速度:

预积分

下一次的状态可以通过当前的状态迭代求解,如下:

对于优化算法需要迭代求解变量$R_{t}^{w}$就会反复计算上式的积分过程,因此把左右都乘一个旋转$R_{w}^{b_k}$将积分转到$b_{k}$坐标系下。

其中:

zero-order hold 欧拉积分(取第i时刻值的斜率乘以时间差加上i时刻的初值,就得到i+1时刻的值)离散形式为:

first-order hold 中值积分(斜率取得是i和i+1中点的时刻斜率)离散形式为:

即为预积分项。

其中预积分项与陀螺仪和加速度计的偏置相关,可以写成一阶泰勒展开近似:

误差状态方程

对于IMU误差状态向量:

Quaternion kinematics for the error-state Kalman filter

对于中值积分, 误差状态方程为:

写成矩阵形式:

因此:

展开:

其中:

令:

则简写为:

最后得到IMU预积分测量关于IMU Bias的雅克比矩阵 $J_{k+1}$ 、IMU预积分测量的协方差矩阵 $P_{k+1}$ 和 噪声的协方差矩阵 $Q$,初始状态下的雅克比矩阵和协方差矩阵为单位阵和零矩阵。

此过程可以和kalman filter 对比:

误差方程

根据IMU积分公式,预测值与测量值相减即可得到误差方程。

其中,$\delta \theta_{b_{k + 1}}^{b_k}$为相邻两个时刻的轴角误差。对于微小旋转,设旋转轴为$n$ 旋转角度为$\theta$:

优化变量

Jacobian

Marginalization

Schur complement

在线性代数与矩阵论中,一个矩阵的子矩阵之舒尔补是一个与其余子阵同样大小的矩阵,定义如下:假设一个 (p+q)×(p+q)的矩阵M被分为A, B, C, D四个部分,分别是p×p、p×q、q×p以及q×q的矩阵,也就是说:

并且D是可逆的矩阵。则D在矩阵中的舒尔补是:

一个简单的例子

假设方程组:

其中x以及a是p维的列向量,而y以及b则是q维的列向量。矩阵A、B、C、D则同上面假设。将第二个方程左乘上矩阵 $ BD^1$,并将得到后的方程与第一个相减,就得到:

因此,如果可以知道D以及D的舒尔补的逆矩阵,就可以解出未知量x之后带入第二个方程 $Cx+Dy=b$就可以解出y。这样,就将 $(p+q)\times (p+q)$矩阵的求逆问题转化成了分别求解一个p×p矩阵以及一个 q×q矩阵的逆矩阵的问题。这样就大大减低了复杂度(计算量)。实际上,这要求矩阵D满足足够好的条件,以使得算法得以成立。

VIO Marginalization

对于高斯牛顿非线性最小二乘的增量迭代方程:

令$\delta x=\left[\delta x_{1}, \delta x_{2}\right]^{T}$ 其中$\delta x_1$ 是需要marginalize掉的变量,$\delta x_2$ 是和$\delta x_1$ 有约束的变量,因此:

进行舒尔消元,得到:

即:

由此即可得到在不求取$\delta x_1$的情况下求取$\delta x_2$的增量迭代公式:

通过观察上式发现,舒尔补消去了变量$\delta x_{1}$并把约束关系叠加到了变量$\delta x_{2}$上,因此保留了先验信息(prior)。

VINS中的Marginalization策略

实验

本次实验传感器为Realsense T265 (stereo fisheye + IMU)。


Reference

A General Optimization-based Framework for Local Odometry Estimation with Multiple Sensors, Tong Qin, Jie Pan, Shaozu Cao, Shaojie Shen, aiXiv
A General Optimization-based Framework for Global Pose Estimation with Multiple Sensors, Tong Qin, Shaozu Cao, Jie Pan, Shaojie Shen, aiXiv
Online Temporal Calibration for Monocular Visual-Inertial Systems, Tong Qin, Shaojie Shen, IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS, 2018)
VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator, Tong Qin, Peiliang Li, Shaojie Shen, IEEE Transactions on Robotics
IMU Preintegration on Manifold for Efficient Visual-Inertial Maximum-a-Posteriori Estimation
A Runge-Kutta numerical integration methods
Quaternion kinematics for the error-state Kalman filter
https://github.com/HKUST-Aerial-Robotics/VINS-Fusion
https://github.com/ethz-asl/kalibr
https://mynt-eye-s-sdk.readthedocs.io/zh_CN/latest/src/slam/how_to_use_kalibr.html
https://blog.csdn.net/qq_39907831/article/details/80983623
https://www.zybuluo.com/Xiaobuyi/note/866099
https://github.com/gaochq/VINS-Mono/tree/comment
《主流VIO技术综述及VINS解析—崔华坤》
《VINS论文推导及代码解析—崔华坤》
https://fzheng.me/2016/11/20/imu_model_eq/
http://www.cnblogs.com/buxiaoyi/p/7541974.html
https://fzheng.me/2018/03/22/okvis-marginalization-base/
https://en.wikipedia.org/wiki/Schur_complement
https://blog.csdn.net/heyijia0327/article/details/52822104
https://github.com/ethz-asl/okvis
https://blog.csdn.net/Pancheng1/article/details/81008081
https://blog.csdn.net/weixin_38358435/article/details/82423511
https://www.cnblogs.com/buxiaoyi/p/8660854.html
https://cggos.github.io/slam/vinsmono_note_cg.html